package com.yunyun400.vosk.service;

import java.io.File;
import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.vosk.Model;

import com.yunyun400.vosk.util.Language;

/**
 * 录音识别服务
 * 负责处理外呼录音文件的语音识别，并检查关键词
 */
@Service
public class RecordingService {
    
    private static final Logger logger = LoggerFactory.getLogger(RecordingService.class);
    
    // 录音文件目录
    @Value("${recording.storage.path}")
    private String RECORDING_DIR;  // FS服务器IP
    
    // 关键词
    private static final String KEYWORD = "resume";
    
    @Autowired
    private SpeechService speechService;

    /**
     * 处理所有录音文件
     * @return 所有检查过的录音文件路径列表
     */
    public List<String> processAllRecordings() {
        logger.info("开始处理录音文件目录: {}", RECORDING_DIR);
        
        List<String> filesWithKeyword = new ArrayList<>();
        List<String> allProcessedFiles = new ArrayList<>();
        File dir = new File(RECORDING_DIR);
        
        // 检查目录是否存在
        if (!dir.exists() || !dir.isDirectory()) {
            logger.error("录音目录不存在: {}", RECORDING_DIR);
            return allProcessedFiles;
        }
        
        try {
            // 遍历目录中的所有文件
            try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(RECORDING_DIR))) {
                for (Path file : stream) {
                    if (Files.isRegularFile(file)) {
                        String filePath = file.toString();
                        logger.info("处理录音文件: {}", filePath);
                        
                        try {
                              // 处理单个录音文件，传递null作为model（内部不再使用）
                              allProcessedFiles.add(filePath); // 无论是否包含关键词，都添加到已处理文件列表
                              boolean containsKeyword = processSingleRecording(filePath, null);
                              if (containsKeyword) {
                                  filesWithKeyword.add(filePath);
                                  logger.info("在文件 {} 中检测到关键词: {}", filePath, KEYWORD);
                              }
                        } catch (Exception e) {
                            logger.error("处理文件 {} 时发生错误", filePath, e);
                        }
                    }
                }
            }
            
            logger.info("录音文件处理完成，共找到 {} 个包含关键词的文件，总共处理 {} 个文件", 
                       filesWithKeyword.size(), allProcessedFiles.size());
            return filesWithKeyword;
            
        } catch (IOException e) {
            logger.error("遍历录音目录时发生错误", e);
            return filesWithKeyword;
        }
    }
    
    /**
     * 处理单个录音文件
     * @param filePath 录音文件路径
     * @param model Vosk模型（保留参数以保持兼容性，但实际使用SpeechService）
     * @return 是否包含关键词
     */
    private boolean processSingleRecording(String filePath, Model model) throws Exception {
        logger.debug("处理录音文件: {}", filePath);
        
        // 创建文件对象
        File mp3File = new File(filePath);

        // 调用SpeechService的方法进行语音识别，使用英语模型
        String recognizedText = speechService.recognizeSpeechFromFile(mp3File, Language.EN);
        logger.info("文件 {} 的识别结果: {}", filePath, recognizedText);
        
        // 检查是否包含关键词（不区分大小写）
        return recognizedText.toLowerCase().contains(KEYWORD.toLowerCase());
        
    }
}